Ruby প্রোগ্রামিং ভাষায় yield এবং block passing দুটি অত্যন্ত গুরুত্বপূর্ণ বৈশিষ্ট্য, যা ফাংশন বা মেথডের মধ্যে ব্লক পাস করা এবং ব্লকের সাথে ইন্টারঅ্যাকশন করতে ব্যবহৃত হয়। এগুলি কোডের পুনঃব্যবহারযোগ্যতা এবং নমনীয়তা বৃদ্ধি করে। yield একটি কীওয়ার্ড যা ব্লকের মধ্যে কোড প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়, এবং block passing হল ব্লক পাস করার একটি পদ্ধতি।
১. yield কী এবং এর ব্যবহার
yield একটি কীওয়ার্ড, যা মেথডের মধ্যে থাকা ব্লককে ডাকা বা কার্যকর করার জন্য ব্যবহৃত হয়। যখন আপনি একটি মেথডে একটি ব্লক পাস করেন, তখন মেথডটি yield ব্যবহার করে ব্লকের কোড এক্সিকিউট করতে পারে।
Syntax:
def method_with_block
yield # এখানে yield ব্লককে চালাবে
end
method_with_block { puts "Hello, Ruby!" }এখানে, method_with_block মেথডের মধ্যে yield ব্যবহার করা হয়েছে, যা পাস করা ব্লকটি চালাবে এবং আউটপুট হিসেবে "Hello, Ruby!" প্রিন্ট করবে।
উদাহরণ:
def greet
yield # ব্লককে চালাবে
end
greet { puts "Hello, World!" }
# আউটপুট: Hello, World!এখানে, greet মেথডে yield ব্যবহার করা হয়েছে, যা পাস করা ব্লককে এক্সিকিউট করবে।
২. ব্লক পাসিং (Block Passing)
ব্লক পাসিং হল মেথডে ব্লক পাস করার একটি পদ্ধতি, যেখানে আপনি মেথডের মাধ্যমে কোডের একটি অংশ বা ব্লক পাস করেন যা পরবর্তীতে yield বা অন্য কোনো পদ্ধতি দ্বারা এক্সিকিউট হবে। ব্লক পাস করা যায় মেথডের আর্গুমেন্ট হিসেবে {} বা do..end ব্যবহার করে।
Syntax:
def method_with_block
yield(parameter) # ব্লককে প্যারামিটার সহ চালানো
end
method_with_block { |name| puts "Hello, #{name}!" }উদাহরণ:
def print_sum(a, b)
yield(a + b) # এখানে yield ব্লককে পাস করা ফলাফলকে পাস করবে
end
print_sum(5, 3) { |sum| puts "The sum is #{sum}" }
# আউটপুট: The sum is 8এখানে, print_sum মেথডে দুইটি আর্গুমেন্ট (৫ এবং ৩) পাস করা হয়েছে, এবং yield ব্লকের মাধ্যমে a + b এর মান পাস করা হয়েছে। ব্লকটি তারপর sum প্যারামিটার হিসাবে সেই মান গ্রহণ করে এবং আউটপুট দেয়।
৩. yield এবং ব্লক পাসিংয়ে প্যারামিটার পাস করা
yield ব্যবহার করার সময় আপনি প্যারামিটার পাসও করতে পারেন, যাতে ব্লকটি সেই প্যারামিটার গ্রহণ করে কাজ করতে পারে।
Syntax:
def method_with_block
yield("Alice") # ব্লককে 'Alice' প্যারামিটার সহ চালাবে
end
method_with_block { |name| puts "Hello, #{name}!" }উদাহরণ:
def greet_person
yield("John") # 'John' প্যারামিটার পাস করা হচ্ছে
end
greet_person { |name| puts "Hello, #{name}!" }
# আউটপুট: Hello, John!এখানে greet_person মেথডে yield ব্যবহার করে "John" নামক প্যারামিটার পাস করা হয়েছে, এবং ব্লকটি সেই প্যারামিটার গ্রহণ করে আউটপুটে "Hello, John!" প্রিন্ট করেছে।
৪. yield এবং block_given?
block_given? একটি মেথড যা চেক করে যদি কোনো ব্লক মেথডের জন্য পাস করা হয়। এটি একটি বুলিয়ান মান (true বা false) প্রদান করে। যদি ব্লক পাস করা না হয়, তাহলে yield একটি ত্রুটি উৎপন্ন করবে, কিন্তু block_given? ব্যবহার করলে আপনি ব্লক থাকলে yield চালাতে পারেন এবং ব্লক না থাকলে আলাদা কোনো কোড এক্সিকিউট করতে পারেন।
Syntax:
def greet
if block_given?
yield
else
puts "No block given"
end
end
greet { puts "Hello, World!" } # আউটপুট: Hello, World!
greet # আউটপুট: No block givenএখানে, block_given? চেক করে ব্লক দেওয়া হয়েছে কি না, এবং তারপরে ব্লকটি এক্সিকিউট করা হয়। যদি ব্লক না থাকে, তাহলে "No block given" প্রদর্শিত হবে।
সারসংক্ষেপ
yield: একটি মেথডের মধ্যে ব্লককে এক্সিকিউট করার জন্য ব্যবহৃত হয়।- Block Passing: মেথডে ব্লক পাস করার পদ্ধতি, যাতে মেথড ব্লকটি এক্সিকিউট করে।
block_given?: চেক করে, মেথডে ব্লক পাস করা হয়েছে কি না।
রুবির yield এবং block passing টেকনিকগুলি মেথডগুলির মধ্যে ব্লকগুলির সাথে কার্যকরভাবে কাজ করতে সহায়ক, এবং এটি কোডের পুনঃব্যবহারযোগ্যতা এবং নমনীয়তা বৃদ্ধি করে।